package com.example.demo.controller

import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Util.println
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.*
import java.io.IOException

import org.springframework.web.servlet.mvc.method.annotation.SseEmitter

import java.util.concurrent.ConcurrentHashMap


@RestController
@CrossOrigin
@RequestMapping
class Hello {
    //第2步：接受用户建立长连接，表示该用户已支付，已支付就可以生成订单(未确认状态)
    @GetMapping("/orderpay")
    fun orderpay( @RequestParam("payid")payid: Long): SseEmitter {
        println("接受连接建立")
        //设置默认的超时时间60秒，超时之后服务端主动关闭连接。
        val emitter = SseEmitter(60 * 1000L)
        sseEmitters.put(payid, emitter)
        emitter.onTimeout { sseEmitters.remove(payid) }
        return emitter
    }

    //第3步：接受支付系统的支付结果告知，表明用户支付成功
    @GetMapping("/payback")
    fun payback(
        @RequestParam("payid")
        payid: Long) {
        //把SSE连接取出来
        val emitter = sseEmitters[payid]
        try {
            println("支付成功")
            //第4步：由服务端告知浏览器端：该用户支付成功了
            emitter!!.send("用户支付成功") //触发前端message事件。
//            emitter.send(SseEmitter.event().name("nothing").id("1").data("哈哈"))
            //触发前端自定义的finish事件
            emitter.send(SseEmitter.event().name("finish").id("1").data("哈哈"))
        } catch (e: IOException) {
            emitter!!.completeWithError(e) //出发前端onerror事件
        }
    }

    companion object {
        //建立之后根据订单id，将SseEmitter存到ConcurrentHashMap
        //正常应该存到数据库里面，生成数据库订单，这里我们只是模拟一下
        val sseEmitters = ConcurrentHashMap<Long, SseEmitter>()
    }
}